import { defineConfig, loadEnv } from 'vite';
import type { UserConfig, ConfigEnv } from 'vite';
import { fileURLToPath } from 'url';
import vue from '@vitejs/plugin-vue';
import VueJsx from '@vitejs/plugin-vue-jsx';
import { viteMockServe } from 'vite-plugin-mock';
import AutoImport from 'unplugin-auto-import/vite';
import Icons from 'unplugin-icons/vite';
import Components from 'unplugin-vue-components/vite';
import IconsResolver from 'unplugin-icons/resolver';
import ElementPlus from 'unplugin-element-plus/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';

export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
	const root = process.cwd();
	const env = loadEnv(mode, root);
	return {
		root, // 项目根目录
		base: '/', // 项目部署的基本路径
		publicDir: fileURLToPath(new URL('./public', import.meta.url)), // 无需处理的静态资源位置
		assetsInclude: fileURLToPath(new URL('./src/assets', import.meta.url)), // 需要处理的静态资源位置
		plugins: [
			// Vue模板文件编译插件
			vue(),
			// jsx文件编译插件
			VueJsx(),
			viteMockServe({
				// 如果接口为 /mock/xxx 以 mock 开头就会被拦截响应配置的内容
				mockPath: 'mock', // 数据模拟需要拦截的请求起始 URL
				enable: true // 本地开发是否启用
			}),
			// 开启ElementPlus自动引入CSS
			ElementPlus({}),
			// 自动引入组件及ICON
			AutoImport({
				resolvers: [IconsResolver(), ElementPlusResolver()],
				dts: fileURLToPath(new URL('./types/auto-imports.d.ts', import.meta.url))
			}),
			// 自动注册组件
			Components({
				resolvers: [IconsResolver(), ElementPlusResolver()],
				dts: fileURLToPath(new URL('./types/components.d.ts', import.meta.url))
			}),
			// 自动安装图标
			Icons({
				autoInstall: true
			})
		],
		// 配置别名
		resolve: {
			alias: {
				'@': fileURLToPath(new URL('./src', import.meta.url)),
				'#': fileURLToPath(new URL('./types', import.meta.url))
			}
		},
		server: {
			host: true, // 指定服务器监听哪个IP地址，如果设置为0.0.0.0或true,则监听全部
			port: 9000, // 开发环境预览服务器端口
			open: false, // 启动后是否自动打开浏览器
			cors: true, // 是否开启CORS跨域
			// 代理服务器
			// 帮助我们开发时解决跨域问题
			proxy: {
				// 这里的意思是 以/api开头发送的请求都会被转发到 http://xxx:9000
				[env.VITE_APP_API_BASEURL]: {
					target: 'http://localhost:9000',
					// 改变 Host Header
					changeOrigin: true
					// 发起请求时将 '/api' 替换为 ''
					//rewrite: (path) => path.replace(/^\/api/, ""),
				},
				[env.VITE_APP_MOCK_BASEURL]: {
					target: 'http://localhost:9000',
					// 改变 Host Header
					changeOrigin: true
					// 发起请求时将 '/api' 替换为 ''
					//rewrite: (path) => path.replace(/^\/api/, ""),
				}
			}
		},
		// 打包配置
		build: {
			sourcemap: false, // 关闭 sorcemap 报错不会映射到源码
			chunkSizeWarningLimit: 400, // 打包大小超出 400kb 提示警告
			rollupOptions: {
				// 打包入口文件 根目录下的 index.html
				input: {
					index: fileURLToPath(new URL('./index.html', import.meta.url))
				},
				// 静态资源分类打包
				output: {
					format: 'esm',
					chunkFileNames: 'static/js/[name]-[hash].js',
					entryFileNames: 'static/js/[name]-[hash].js',
					assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
				}
			}
		}
	};
});
